/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package webservices;

import entities.Commercant;
import entities.Client;
import entities.Utilisateur;
import java.awt.Image;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import org.primefaces.json.*;
import sessions.GestionnaireUtilisateur;

/**
 *
 * @author Miage
 */
@Path("utilisateurs")
public class UtilisateurFacadeREST {

    GestionnaireUtilisateur gestionnaireUtilisateur = lookupGestionnaireUtilisateurBean();
    private final String ID = "ID";
    private final String LOGIN = "LOGIN";
    private final String MDP = "MDP";
    private final String NOM = "NOM";
    private final String PRENOM = "PRENOM";
    private final String MAIL = "MAIL";
    private final String TEL = "TELEPHONE";
    private final String TYPE = "Client";

    @POST
    @Consumes({"application/json"})
    public void create(String entity) {
        try {
            // On récupère le String envoyé par l'appli Android
            // et on le transforme en JSON pour récuperer les infos
            JSONObject jo = new JSONObject(entity);
            Client user = new Client();


            // On utilise les infos du JSON pour construire l'Utilisateur
            user.setLogin(jo.getString(LOGIN));
            user.setMotDePasse(jo.getString(MDP));
            user.setNom(jo.getString(NOM));
            user.setPrenom(jo.getString(PRENOM));
            user.setEmail(jo.getString(MAIL));
            user.setTelephone(jo.getString(TEL));

            // On le met en BD
            gestionnaireUtilisateur.creerUtilisateur(user);
        } catch (Exception ex) {
            Logger.getLogger(UtilisateurFacadeREST.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @PUT
    @Consumes({"application/json"})
    public void edit(String entity) {
        try {
            // On récupère le String envoyé par l'appli Android
            // et on le transforme en JSON pour récuperer les infos
            JSONObject jo = new JSONObject(entity);
            Client user = (Client) gestionnaireUtilisateur.getUtilisateurById(jo.getLong(ID), TYPE);

            // On utilise les infos du JSON pour modifier l'Utilisateur
            /* TODO 
             * faire les verifs pour l'email ou le telephone
             */
            user.setMotDePasse(jo.getString(MDP));
            user.setNom(jo.getString(NOM));
            user.setPrenom(jo.getString(PRENOM));
            user.setEmail(jo.getString(MAIL));
            user.setTelephone(jo.getString(TEL));

            gestionnaireUtilisateur.modifierUser(user);
        } catch (Exception ex) {
            System.err.print(ex.getLocalizedMessage());
        }
    }

    @DELETE
    @Path("{id}")
    public void remove(@PathParam("id") Long id) {
        gestionnaireUtilisateur.supprimerUser(find(String.valueOf(id)));
    }

    @GET
    @Path("count")
    @Produces("text/plain")
    public String countAll() {
        return String.valueOf(gestionnaireUtilisateur.getCount("Utilisateur"));
    }

    
    @GET
    @Path("count/{type}")
    @Produces("text/plain")
    public String countType(@PathParam("type") String type) {
        return String.valueOf(gestionnaireUtilisateur.getCount(type));
    }

    @GET
    @Path("{recherche}")
    @Produces({"application/json"})
    public Utilisateur find(@PathParam("recherche") String recherche) {
        if( recherche.contains("@"))
            return gestionnaireUtilisateur.getUtilisateurByEmail(recherche);
        else if (recherche.matches("^\\p{Digit}+$") )
            return gestionnaireUtilisateur.getUtilisateurById(Long.valueOf(recherche));
        else
            return gestionnaireUtilisateur.getUtilisateurByLogin(recherche);
    }

    @POST
    @Path("getUser")
    @Produces({"application/json"})
    public Utilisateur findUser(String entity) {
        try {
            JSONObject jo = new JSONObject(entity);
            Client client = (Client)gestionnaireUtilisateur.getUtilisateur(jo.getString(LOGIN), jo.getString(MDP), jo.getString("TYPE"));
            return client;
        } catch (Exception e) {
            return null;
        }
    }

    @GET
    @Produces({"application/json"})
    public List<Utilisateur> findAll() {
        return gestionnaireUtilisateur.getUsers();
    }

    

    private GestionnaireUtilisateur lookupGestionnaireUtilisateurBean() {
        try {
            Context c = new InitialContext();
            return (GestionnaireUtilisateur) c.lookup("java:global/TheCityRater/TheCityRater-ejb/GestionnaireUtilisateur!sessions.GestionnaireUtilisateur");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }
}
